package cn.edu.ncu.housinghub.service;

import cn.edu.ncu.housinghub.dto.request.house.HouseConditionRequest;
import cn.edu.ncu.housinghub.dto.request.house.HouseInfoUpdateRequest;
import cn.edu.ncu.housinghub.dto.request.house.HouseRequest;
import cn.edu.ncu.housinghub.dto.request.house.NearbyHouseRequest;
import cn.edu.ncu.housinghub.entity.house.ComplementaryFacilities;
import cn.edu.ncu.housinghub.dto.request.house.PropertyVerificationRequest;
import cn.edu.ncu.housinghub.dto.response.house.PageResult;
import cn.edu.ncu.housinghub.entity.house.House;
import cn.edu.ncu.housinghub.entity.house.PropertyVerification;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *房源业务
 */
@Service
public interface HouseService {
    /**
     * 提交房产认证（包含用户角色转换）
     * @param propertyVerificationRequest 房产认证请求
     */
    void submitPropertyVerification(PropertyVerificationRequest propertyVerificationRequest);

    /**
     * 审核通过后发布房源
     * @param houseRequest 房源请求
     */
    void publishHouseAfterVerification(HouseRequest houseRequest);

    /**
     * 根据房产认证id查询房产认证信息
     * @param propertyVerifyId 房产认证id
     * @return 房产认证信息
     */
    PropertyVerification findPropertyVerificationById(Long propertyVerifyId);

    List<House> selectAllHouses();
    List<House> selectHousesByCondition(HouseConditionRequest condition);

    List<House> selectNearbyHouses(NearbyHouseRequest request);
    /**
     * 添加配套设施
     * @param complementaryFacilities 配套设施
     */
    void addComplementaryFacilities(ComplementaryFacilities complementaryFacilities);


    /**
     * 根据配套设施条件查询配套设施id
     * @param condition 配套设施条件
     * @return 配套设施id
     */
    Long findComplementaryFacilitiesIdByCondition(ComplementaryFacilities condition);


    /**
     * 根据用户id查询房产认证信息
     * @param userId 用户id
     * @return 房产认证信息
     */
    List<PropertyVerification> findPropertyVerificationByUserId(Long userId);

    /**
     * 根据房东id查询房源信息
     * @param landLordId 房东id
     * @return 房源信息
     */
    List<House> findHouseByLandLordId(Long landLordId);

    /**
     * 根据房产编号查询房产认证信息
     * @param propertyNo 房产编号
     * @return 房产认证信息
     */
    int findByPropertyNo(String propertyNo);


    /**
     * 根据房产认证id查询房产认证信息（验证房产信息是否存在）
     * @param propertyVerifyId 房产认证id
     * @return 1：存在，0：不存在
     */
    int findByPropertyVerifyId(Long propertyVerifyId);

    /**
     * 软删除标记已被驳回的房产认证信息
     * @param propertyVerifyId 房产认证id
     * @param userId 用户id
     */
    void modifyPropertyVerificationDeleted(Long propertyVerifyId,Long userId);

    /**
     * 批量软删除标记已被驳回的房产认证信息
     * @param propertyVerifyIds 房产认证id列表
     * @param userId 用户id
     */
    void modifyBatchPropertyVerificationDeleted(List<Long> propertyVerifyIds, Long userId);

    /**
     * 更新房源信息
     * @param infoUpdateRequest 房源信息更新请求
     */
    void modifyHouseInfo(HouseInfoUpdateRequest infoUpdateRequest);

    /**
     * 更新配套设施
     * @param houseId 房源id
     * @param complementaryFacilities 配套设施
     */
    void modifyComplementaryFacilities(Long houseId,ComplementaryFacilities complementaryFacilities);

    PageResult<House> selectNearbyHousesWithPage(NearbyHouseRequest request);

    /**
     * 根据房产编号查询房产认证状态
     * @param propertyNo 房产编号
     * @return 房产认证状态（0=待审核，1=通过，2=驳回，3=已取消）
     */
    Integer findPropertyVerifyStatusByPropertyNo(String propertyNo);

    /**
     * 根据房源ID获取房源详情（包含配套设施和电话）
     * @param houseId 房源ID
     * @return 房源详情
     */
    House getHouseDetailById(Long houseId);

    /**
     * 根据房产编号查询房产认证拒绝理由
     * @param propertyNo 房产编号
     * @return 房产认证拒绝理由
     */
    String findPropertyVerifyRefuseReasonByPropertyNo(String propertyNo);

    /**
     * 根据房产编号取消房产认证
     * @param propertyNo 房产编号
     */
    void modifyCancelPropertyVerifyByPropertyNo(String propertyNo);

    /**
     * 房东下架或重新上架房源
     * @param houseId 房源id
     * @param houseStatus 房源状态 0=上架重新为待出租状态，2=下架
     */
    void modifyHouseStatus(Long houseId, Integer houseStatus);

    /**
     * 根据房产ID查询房产信息
     * @param houseId 房产ID
     * @return 房产信息
     */
    House findHouseByHouseId(Long houseId);

    /**
     * 根据配套设施ID查询配套设施信息
     * @param id 配套设施ID
     * @return 配套设施信息
     */
    ComplementaryFacilities findComplementaryFacilitiesById(Long id);
}
